<?php

/**
 * 可变数量的参数列表
 *
 * 1.定义函数... 的参数， 会转换为指定参数变量的一个 array
 * 2.调用函数，使用 ... 语法来传递 array  函数参数自动解包
 *   不能解包使用符串的数组
**/



function api($data = [], $msg = '响应正常', $code = 0) {
    return [
        'data' => $data,
        'msg' => $msg,
        'code' => $code,
    ];
}



//$part = ['msg' => '响应怎么有问题了',12];  //不能解包使用符串的数组
/*$part = ['响应怎么有问题了',12];
$ret = api([123], ...$part);*/

$part = [[], 'success', 0];
//实参解包
$ret = api(...$part);


//可变数量参数封包
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);

var_dump($ret);

//switch使用方法
$i = 3;
switch ($i) {
    case 0:
    case 3:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}

//全局变量在函数内定义
function setGlobals()
{
    $GLOBALS['b'] = 'bbb';
}

setGlobals();
echo $b;



//函数内定义的函数
hello();
hi();

function hello()
{
    echo "helo";
    function hi() {
        echo "hi";
    }
    hi();
}


//函数内的静态变量
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();
test();
test();

//echo $a;  //在外部无法调用函数内的静态变量

echo "\n定义并直接执行函数:";

(function () { echo '匿名函数直接执行';})();

//申明一个匿名函数变量
$a = function () { echo '匿名函数直接执行:A';};

echo "\n返回匿名函数和执行匿名函数是两件事";
//直接返回一个匿名函数,而不是执行了函数里的内容
function getClouse() {
    return function () { echo '匿名函数直接执行:A';};
}
